package dca.sistemascontrole.handler;

import dca.sistemascontrole.dao.GraphicDataManager;
import dca.sistemascontrole.driver.GerenciadorComunicacao;
import dca.sistemascontrole.malhadecontrole.Clock;
import dca.sistemascontrole.malhadecontrole.Controlador;
import dca.sistemascontrole.malhadecontrole.MalhaAberta;
import dca.sistemascontrole.malhadecontrole.MalhaDeControle;
import dca.sistemascontrole.util.ControleConstantes;
import dca.sistemascontrole.util.XMLManager;
import dca.sistemascontrole.view.DialogConfigurarPortas;
import dca.sistemascontrole.view.MainFrame;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.JFileChooser;

/**
 *
 * @author Rafael
 */
public class HandlerMainFrame {

    private Clock clock;
    private MainFrame mainFrame;
    private Controlador controlador;
    private MalhaDeControle malhaDeControle = new MalhaAberta();
    private GraphicDataManager graphicDataManager = new GraphicDataManager();
    private GerenciadorComunicacao gerenciadorComunicacao = new GerenciadorComunicacao();

    public HandlerMainFrame(MainFrame mainFrame) {
        clock = new Clock(this);
        this.mainFrame = mainFrame;
    }

    public void setMalhaDeControle(MalhaDeControle malhaDeControle) {
        this.malhaDeControle = malhaDeControle;
    }

    public void interromper() {
        malhaDeControle = new MalhaAberta();
    }

    public void showDialogoConfiguração() {
        DialogConfigurarPortas dialogoConfigurarPortas = new DialogConfigurarPortas(mainFrame, true, gerenciadorComunicacao);
        dialogoConfigurarPortas.setVisible(true);
    }

    public synchronized void setVariaveisNivel(double valueSuperior, double valueInferior, double setPoint, double erro) {
        mainFrame.setVariaveisNivel(valueSuperior, valueInferior, setPoint, erro);
        
        graphicDataManager.addTanqueInferior(valueInferior);
        graphicDataManager.addTanqueSuperior(valueSuperior);
        graphicDataManager.addSetpoint(erro);
        graphicDataManager.addErro(erro);
    }

    public synchronized void setVariaveisTensao(double uSaturado, double u, double ui, double up, double ud) {
        mainFrame.setVariaveisTensao(uSaturado, u, ui, up, ud);
        
        graphicDataManager.addUSaturado(uSaturado);
        graphicDataManager.addU(u);
        graphicDataManager.addUi(ui);
        graphicDataManager.addUp(up);
        graphicDataManager.addUd(ud);
    }

    public void saveGraphicData() throws FileNotFoundException, IOException {
        JFileChooser fileChooser = new JFileChooser(new File(ControleConstantes.FILE_CONFIGURACAO));
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int option = fileChooser.showOpenDialog(mainFrame);

        if (option == JFileChooser.APPROVE_OPTION) {
            String absolutePath = fileChooser.getSelectedFile().getAbsolutePath();

            XMLManager.writeObject(graphicDataManager, absolutePath + "." + ControleConstantes.FILE_IDENTIFICADOR_DADOS);
        }
    }

    public void iniciarClock() {
        clock.start();
    }

    public void runControlador() {
        if (controlador == null || controlador.isDone()) {
            controlador = new Controlador(malhaDeControle, this, gerenciadorComunicacao);
            controlador.execute();
        }
    }

    public void clear() {
        graphicDataManager.clear();
    }
}
